//- Mixin 更像一个函数, 可以是无参的, 也可以是有参的, 定义之后只需要在希望使用它的地方调用即可
mixin list
    ul
        li foo
        li bar
+list
+list

//- 在调用传入参数时, 除了可以使用 #{} 外, 还可以直接使用 = 调用, 但是左值必须和等号相连
mixin student(name)
    h1 #{name}
+student("terry")
mixin student(name)
  h1= name
+student("terry")

//- 可以包含 block, 而且可以和参数同时存在; 调用包含 block 的 mixin 时传入 block 的方法就是
//- 在 mixin 调用行下缩进即可, 当结束 block 时只需结束当前缩进即可
p
mixin addTitle(title)
    h1= title
    if block
        block
    else
        p no block
+addTitle('Hello world')
//- 第一次调用时我们只传入了参数 title, 没有传入 block;
//- 第二次调用时, 我们除了传入了参数 title 外, 还在下边传入了一个 blcok
+addTitle('Hello world')
    p this is a block

//- 可以获取一个隐式的 atrributes, 通过这个隐式的 attributes 对象向 mixin 中传入属性
//- 并且可以在 Mixin 中通过 attributes 过去其属性
mixin addTitle(title)
    title(class=attributes.class)= title
+addTitle("Demo")(class="test")
//- 还可以使用 &amp;attributes 来直接将 attributes 对象传给 mixin,
//- 而且事实上 &amp;attributes 在处理这件事情上也是最擅长的
mixin p(text)
    p&attributes(attributes)!= text
+p("this is &attributes demo")(id="demo")

//- 我们两种标签都有好多个重复的, 但是这两种标签数量又不一定一样, 而且还可以重用一段代码来生成模板
//- 那么此时我们就可以使用 Rest Arguments 来达到数量不确定的目的
mixin list(id, items)
    ul(id=id)
        each item in items
            li= item
+list('first', [1, 2, 3, 4])
+list('second',['a', 'b', 'c', 'd', 'e'])
